/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 *
 * @author Christopher
 */
import java.util.ArrayList;
import java.util.InputMismatchException;
import java.util.List;
import java.util.Scanner;
import java.util.LinkedList;
public class Driver {
    public static List<Cliente> evento = new ArrayList<Cliente>();
    private static Cliente clin = new Cliente();
    private static Cliente clientetem = new Cliente() ;
    /**
     * 
     * @param args 
     */
    public static void main(String args[]){
        
        LinkedList<Cliente> caja1;
        LinkedList<Cliente> caja2;
        LinkedList<Cliente> caja3; 
        LinkedList<Cliente> caja4;
        Cliente mi_cliente;
        int op1, cant, tiempoE, tiempot;
        int sa=0, sa1=0, sa2=0, sa3 = 0;
        
        do{
            menu();
            op1 = (int)obtenerNumero("Elija una opción: ", true);
            cant = 0;
            tiempot = 0;
            switch(op1){
                case 1:
                    caja1 = new LinkedList();
                    caja2 = new LinkedList();
                    caja3 = new LinkedList();
                    caja4 = new LinkedList();

                    tiempoE = (int)obtenerNumero("Ingrese tiempo de entrada del cliente No. 1: ", true);
                   
                    
                    for(int x = 1; tiempoE>0; x++){
                        mi_cliente = new Cliente();
                        
                        evento.add(mi_cliente);
                        mi_cliente.setNumero(x);
                        mi_cliente.setTiempoE(tiempoE);
                        mi_cliente.setTiempoO();
                        cant ++;
                        tiempoE = (int)obtenerNumero("Ingrese tiempo de entrada del cliente No. " + (x+1)+ " o un negativo para finalizar : ",true);
                    }
                    
                    
                    for(int i = 0; i<evento.size(); i++){
                        mi_cliente = new Cliente();
                        mi_cliente = (Cliente)evento.get(i);
                        int [] mis_tamanos = new int[4];
                        int menor;
                        mis_tamanos[0] = caja1.size();
                        mis_tamanos[1] = caja2.size();
                        mis_tamanos[2] = caja3.size();
                        mis_tamanos[3] = caja4.size();

                        
                       menor = getValMin(mis_tamanos);
                       switch(menor){
                           case 0:
                               caja1.offer(mi_cliente);
                               mi_cliente.setCola(1);
                               if(!(sa-(mi_cliente.getTiempoE()-1)<0)){
                                   sa = sa - (mi_cliente.getTiempoE()-1);
                               }
                               mi_cliente.setTiempoT(sa);
                               mi_cliente.setTiempoS();
                               sa = mi_cliente.getTiempoS();
                               tiempot += sa;
                               System.out.println(mi_cliente);
                               saliendo(mi_cliente.getTiempoT(),mi_cliente,1);
                               break;
                               
                           case 1:
                               caja2.offer(mi_cliente);
                               mi_cliente.setCola(2);
                               if(!(sa1-(mi_cliente.getTiempoE()-1)<0)){
                                   sa1 = sa1 - (mi_cliente.getTiempoE()-1);
                               }
                               mi_cliente.setTiempoT(sa1);
                               mi_cliente.setTiempoS();
                               sa1 = mi_cliente.getTiempoS();
                               tiempot += sa1;
                               System.out.println(mi_cliente);
                               saliendo(mi_cliente.getTiempoT(),mi_cliente,2);
                               break;
                                   
                           case 2:
                               caja3.offer(mi_cliente);
                               mi_cliente.setCola(3);
                                if(!(sa2-(mi_cliente.getTiempoE()-1)<0)){
                                   sa2 = sa2 - (mi_cliente.getTiempoE()-1);
                               }
                               mi_cliente.setTiempoT(sa2);
                               mi_cliente.setTiempoS();
                               sa2 = mi_cliente.getTiempoS();
                               tiempot += sa2;
                               System.out.println(mi_cliente);
                               saliendo(mi_cliente.getTiempoT(),mi_cliente,3);
                               break;
                           case 3:
                               caja4.offer(mi_cliente);
                               mi_cliente.setCola(4);
                               if(!(sa3-(mi_cliente.getTiempoE()-1)<0)){
                                   sa3 = sa3 - (mi_cliente.getTiempoE()-1);
                               }
                               mi_cliente.setTiempoT(sa3);
                               mi_cliente.setTiempoS();
                               sa3 = mi_cliente.getTiempoS();
                               tiempot += sa3;
                               System.out.println(mi_cliente);
                               saliendo(mi_cliente.getTiempoT(),mi_cliente,4);
                               break;
                       }

                    }
                    tiempot = tiempot/cant;
                    System.out.println("Tiempo de espera promedio son: " + tiempot + " minutos");
                    
                    break;  
                case 2:
                   System.out.println("Despedida!!!");
                    System.out.println();
                    break;   
                default:
                    System.out.println("Debe ingresar una opcion valida del Menu");
                    System.out.println("intentelo de nuevo.");
                    System.out.println();
            }
        }while(op1 != 2); 
    }
    /**
     * menu()
     */
    public static void menu(){
        System.out.println("**************************");
        System.out.println("*          Menu          *");
        System.out.println("**************************");
        System.out.println("1. Lista arreglos         ");
        System.out.println("2. Salir                  ");
        System.out.println("**************************");
        System.out.println(                            );
    }
    
    	/**
        * solicita al usuario que ingrese un dato valido
        * en caso contrario manda una excepcion y le indica al usuario
        * que el dato ingresado es incorrecto. 
        * @param mensaje String
        * @param mostrar boolean
        */
    public static double obtenerNumero(String mensaje, boolean mostrar){
        Scanner ingreso = new Scanner(System.in);
        double num = -1;
        
        System.out.print(mensaje);
        try{
            num = ingreso.nextDouble();
        }
        catch(InputMismatchException exception){
            if (mostrar)
                System.out.println("\nERROR: ~~> Dato invalido. :O(\n");
        }
        finally{
            ingreso.nextLine();//Atrapar el ENTER
        }
        return num;
    }
    /**
     * Devuelve el indice que contiene el valor mas pequenio de la lista de 
     * enteros que se le manda como parametro
     * @param numbers
     * @return numbers int[]
     */
    public static int getValMin(int[] numbers){  
        int minValue = numbers[0]; 
        int ret = 0;

        for(int i=1;i<numbers.length;i++){  
            if(numbers[i] < minValue){  
                minValue = numbers[i];
                ret = i;
            }  
        }  
        return ret;  
    }
    /**
     * Verifica si un Cliente ya debe salir del banco o no
     * @param ts
     * @param clint
     * @param x 
     */
    public static void saliendo(int ts, Cliente clint, int x){
        for(int i = 0; i<evento.size(); i++){
            clientetem = evento.get(i);
            if(clientetem.getTiempoT()>0){
                if(clientetem.getEstado()){
                    if(ts < clientetem.getTiempoE()){
                        clientetem.setCola(x);
                        clientetem.setEstado(false);
                        System.out.println(clientetem);
                        evento.remove(clientetem);
                    }
                }
                if(clientetem.getEstado()){
                    if(ts< clientetem.getTiempoO()){
                        clientetem.setCola(x);
                        clientetem.setEstado(false);
                        System.out.println(clientetem);
                        evento.remove(clientetem);
                    }
                }
            }
            
        }
    }    
   
}